//
// * Copyright (c) 2002-2009 "Neo Technology,"
// *     Network Engine for Objects in Lund AB [http://neotechnology.com]
// *
// * This file is part of Neo4j.
// * 
// * Neo4j is free software: you can redistribute it and/or modify
// * it under the terms of the GNU Affero General Public License as
// * published by the Free Software Foundation, either version 3 of the
// * License, or (at your option) any later version.
// * 
// * This program is distributed in the hope that it will be useful,
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// * GNU Affero General Public License for more details.
// * 
// * You should have received a copy of the GNU Affero General Public License
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
// 
namespace org.neo4j.kernel.impl.core
{


	using IntArray = org.neo4j.kernel.impl.util.IntArray;

	internal class FastRelTypeElement : RelTypeElementIterator
	{
		private readonly IntArray src;

		private int position = 0;
		private int nextElement = null;

		internal FastRelTypeElement(string type, NodeImpl node, IntArray src) : base(type, node)
		{
			if (src == null)
			{
				this.src = new IntArray();
			}
			else
			{
				this.src = src;
			}
		}

		public virtual bool hasNext()
		{
			if (nextElement != null)
			{
				return true;
			}
			if (position >= src.Length)
			{
				while (getNode().getMoreRelationships() && position >= src.Length);
			}
			while (position < src.Length)
			{
				nextElement = src.Get(position++);
				return true;
			}
			return false;
		}

		public int next()
		{
			hasNext();
			if (nextElement != null)
			{
				int elementToReturn = nextElement;
				nextElement = null;
				return elementToReturn;
			}
			throw new NoSuchElementException();
		}

		public void Remove()
		{
			throw new UnsupportedOperationException();
		}
	}

}